<?php
//  +----------------------------------------------------------------------
//  | Copyright (c) 2015-2025 http://www.hdphp.cn All rights reserved.
//  | Licensed ( http://www.hdphp.cn/licenses/ )
//  | Author: Jack <sophia2152@qq.com>
//  | 官方网址: http://www.hdphp.cn
//  | 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用。
//  | 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
//  +----------------------------------------------------------------------
namespace hdphp\utils;

use think\facade\Config;
use think\facade\Lang;
use think\Log;
use think\Response;

/**
 * Json输出类
 * Class Json
 * @package hdphp\utils
 */
class Json
{
    /**
     * http状态code
     * @var int
     */
    private $code = 200;

    /**
     * 注释：code
     * 创建人：Jack
     * 创建时间：2023/11/22 14:04
     * @param int $code
     * @return $this
     */
    public function code(int $code): self
    {
        $this->code = $code;
        return $this;
    }

    /**
     * 注释：压缩数据
     * 创建人：Jack
     * 创建时间：2023/11/22 14:31
     * @param $str
     * @return string
     */
    protected function compress($str)
    {
        return base64_encode(gzdeflate(json_encode($str, JSON_UNESCAPED_UNICODE), 9));
    }

    /**
     * 注释：创建响应
     * 创建人：Jack
     * 创建时间：2023/11/22 14:04
     * @param int        $errcode
     * @param string     $errmsg
     * @param array|null $data
     * @return Response
     */
    public function make(int $errcode, string $errmsg, ?array $data = null): Response
    {
        $request = app()->request;
        $res = compact('errcode', 'errmsg');

        if (!is_null($data)) {
            $jsonData = json_encode($data);
            // 在debug关闭的时候返回压缩数据
            $compressData = null;
            if (strstr('/' . app()->request->rule()->getRule(), '/api/') !== false && strlen($jsonData) > 1024 && app()->config->get('cache.is_gzde', false)) {
                $compressData = $this->compress($data);
                $res['gzde'] = 1;
            }
            $res['data'] = $compressData ?: $data;
        }

        if ($res['errmsg'] && !is_numeric($res['errmsg'])) {
            if (!$range = $request->get('lang')) {
                $range = $request->cookie(Config::get('lang.cookie_var'));
            }
            $langData = array_values(Config::get('lang.accept_language', []));
            if (!in_array($range, $langData)) {
                $range = 'zh-cn';
            }
            $res['errmsg'] = Lang::get($res['errmsg'], [], $range);
        }

        // 记录原始数据
        $response = $res;
        $response['data'] = $data;
        response_log_write($res, Log::INFO);

        return Response::create($res, 'json', $this->code);
    }

    /**
     * Notes：操作成功
     * User：Jack
     * DateTime：2022/10/10 14:08
     * @param string|array $errmsg
     * @param array|null   $data
     * @return Response
     */
    public function success($errmsg = 'success', ?array $data = null): Response
    {
        if (is_array($errmsg)) {
            $data = $errmsg;
            $errmsg = 'success';
        }

        return $this->make(200, $errmsg, $data);
    }

    /**
     * 注释：操作错误
     * 创建人：Jack
     * 创建时间：2024/1/12 10:00
     * @param string|array $errmsg
     * @param array|null   $data
     * @return Response
     */
    public function fail($errmsg = 'error', ?array $data = null): Response
    {
        if (is_array($errmsg)) {
            $data = $errmsg;
            $errmsg = 'success';
        }

        return $this->make(400, $errmsg, $data);
    }

    public function status($status, $msg = 'ok', $result = [])
    {
        $status = strtoupper($status);
        if (is_array($msg)) {
            $result = $msg;
            $msg = 'success';
        }
        return $this->success($msg, compact('status', 'result'));
    }
}